一、Linux命令进阶
思考:
- top命令: 如何以占用CPU使用率顺序排序及占用内存使用率顺序排序?
- free命令如何以G为单位显示磁盘使用情况?
- touch命令创建文件,创建一个已存在的文件时,执行后会有啥变化?
- 当执行df命令查看磁盘空间大于90%的时候,如何定位Linux系统的是那一个目录占据磁盘比较大?
二、Java 基础
-
都说 C 是面向过程的语言,Java 是面向对象的语言,请解释这其中的差别,并讲讲 Python 是什么类型的语言,区别是什么
-
请简述线程和死锁的概念,并且用代码实现线程死锁,在代码中以注释的形式标注死锁的条件
第三、四问对具体数值不做要求
-
生产者与消费者
前面说到 Java 是一门面向对象的语言,现在假设有这样一个场景:
有一个生产基地,基地里的员工能够生产产品,但是产品的储存上限是10个,如果超过10个则会停止生产,于此同时,顾客也会在同一时间购买产品,也就是说,员工一边生产,顾客一边购买,并且员工每次生产完后都需要休息一下,顾客买完之后会用一段时间使用产品并继续购买。假设基地内只有一个员工,有两名顾客,请你模拟这样的一个场景,并在每次的购买或生产后输出剩余的商品数量。(如果商品卖完了,那么顾客就会等待。) -
生产者与消费者的另一个场景:
有一个生产基地,基地生产两类产品,平面产品和三维产品。平面产品包括长方形和三角形,每个平面产品需要计算其面积。三维产品包括长方体和圆柱体,每个三维产品需要计算体积。
有一个仓库用于存放生产的产品,仓库的面积和体积是固定的,存放平面产品将占用面积,存放三维产品将占用体积。
基地里有三名员工,一个负责生产平面产品,两个负责生产三维产品,生产后产品放入仓库(生产时显示详细信息),存入时如果剩余空间不足,抛出带剩余空间的空间不足异常。
有三名消费者,两个消费平面产品,一个消费三维产品,消费时从仓库取出产品(消费时显示详细信息),如果仓库中没有需要的产品可以取出,抛出相应的异常消息。
请完成以上要求,每个生产者或者消费者用一个线程模拟,注意类之间的继承关系和清晰的目录结构
产品有具体属性,需要以此计算面积和体积,例如,长方形具有长宽,三角形具有底和高
建议通过类图辅助理解,画类图加分
三、Python 综合
[blame Meursault]
这是这份题目中最值得做的一道题,做出来后找出题人,他可以特招。
阅读如下材料,并利用 Python 或其他你喜欢的编程语言完成后续题目。
游戏《原神》作为文化输出的优秀代表,塑造了许多可歌可泣的优秀人物,他们中有文智高绝、厚貌深情的草神,有仁厚宽容、宛然太清的芙卡洛斯,有进退黜陟、皆出圣心的那维莱特,还有忠心友善,人见人爱,有着高洁善良的灵魂,足以列为道德楷模的其他。
有人称:“我曾于上海的夜里看见米哈游的总部,灯火通明,预示着未来与先知,犹如命运照向我与无尽人世!”这足以看出《原神》这一游戏的优秀,它代表着中国游戏产业乃至整个互联网产业的方向。
- 请通过编程的方式获取 Bilibili 弹幕视频网站中《原神》官方账号的粉丝数随时间的变化,要求:获取持续四小时的原神粉丝数数量变化,每分钟记录一次,也就是获取 240 条数据,并将数据以你喜欢的文件格式保存。我们将对这些数据进行验证,所以请注意文件中需包含时间信息。
- 请通过 Python 程序实现上述数据的绘制能描述这段时间原神粉丝数变化的图形,可以使用折线图、散点图等。提示:Python 中常用的绘图库有 Matplotlib、Seaborn 等。
- (选做)任选一个机器学习模型,对上述数据进行拟合,能够预测后续《原神》官方账号的粉丝数的变化。
- (选做)完成一个简易服务端程序,实现:
- 对《原神》官方账号的粉丝数的爬取与暂停
- 能够获取当前爬取的最新一条数据。
- 尝试使用数据库对数据进行持久化。
- 实现一个简单的可视化界面,实现类似第二问中折线图的输出,或者在启动后实时绘制上述折线图。
- 尝试对服务器端程序进行容器化部署。
- 在开发过程中尝试使用 GitLab CI,请注意,SynX GitLab 不提供 CI 能力,你可以使用 GitLab SaaS。
提示:常用的 Python 服务端框架有 Flask、Sanic、FastAPI 等,本问对请求体和响应体不做要求,请自行设计并给出文档。
四、MySQL
学习软件工程没有数据库怎么刑?
在基础部分中,你已经了解Linux系统的常用使用基础了,下面请在Linux系统中安装Mysql并启用服务。
- 安装mysql
- 建立下图所示的Employee 表
+----+-------+--------+-----------+ | id | name | salary | managerId | +----+-------+--------+-----------+ | 1 | Joe | 70000 | 3 | | 2 | Henry | 80000 | 4 | | 3 | Sam | 60000 | Null | | 4 | Max | 90000 | Null | +----+-------+--------+-----------+
- 利用sql语句查询高于领导工资的员工
Tip: managerId指的是该员工对应领导的id,即查询输出的表应该为:+----------+ | Employee | +----------+ | Joe | +----------+
五、Docker
Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间完全隔离,性能开销极低。
- 在你的Linux系统上安装 Docker。验证 Docker 是否成功安装,尝试运行一个 hello-world 镜像。
- 下载并运行 Nginx 镜像:
下载 Nginx 镜像。运行 Nginx 镜像,并映射一个端口到宿主机。 - 创建并运行一个简单的容器:
创建一个 Dockerfile,其中包含一个基础的 Ubuntu 镜像,并添加一个简单的 shell 脚本。构建 Docker 镜像,并运行一个容器。 - 配置 Docker 网络:
创建自定义 Docker 网络。将容器连接到自定义网络,并测试容器之间的通信。 - 使用 Docker Volumes 存储数据:
创建一个容器,其中包含一个 MySQL 数据库,并使用 Docker Volumes 来持久化数据库数据。
六、简单服务部署
LNMP为一种缩写,其代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。
Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、suse等。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Mysql是一个关系型数据库管理系统。
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。
接下来,让我们尝试从使用nginx部署静态页面开始吧!
- 在Linux中安装并启动nginx。在Windows下访问得到该网页说明部署成功。
- 尝试部署下文提供的静态网页并进行本机访问
welcome.html - 有能力的同学可以尝试部署在校内可以访问的网页。
七、Linux编程初步
- 现有如下程序。在Linux系统中将其编译成可执行文件后,使用ls -l命令显示可执行文件的大小。虽然该程序包含一个大约 10MB 的数组,但可执行文件大小要远小于此,为什么?
#include <stdio.h> #include <stdlib.h> char globBuf[65536]; int primes[] = {2, 3, 5, 7}; static int square(int x) { int result; result = x * x; return result; } static void doCalc(int val) { printf("The square of %d is %d\n", val, square(val)); if (val < 1000){ int t; t = val * val * val; printf("The cube of %d is %d\n", val, t); } } int main(int argc, char *argv[]) { static int key = 9973; static char mbuf[10240000]; char *p; p = malloc(1024); doCalc(key); exit(EXIT_SUCCESS); }
- 阅读以下文本
每个 C 语言程序都必须有一个称为 main()的函数,作为程序启动的起点。当执行程序时,命令行参数(command-line argument)(由 shell 逐一解析)通过两个入参提供给 main()函数。第一个参数 int argc,表示命令行参数的个数。第二个参数 char *argv[],是一个指向命令行参数的指针数组,每一参数又都是以空字符(null)1 结尾的字符串。第一个字符串,亦即 argv[0]指向的,(通常)是该程序的名称。argv 中的指针列表以 NULL 指针结尾(即 argv[argc]为 NULL)。
每一个进程都有与其相关的称之为环境列表(environment list)的字符串数组,或简称为环境(environment)。其中每个字符串都以名称=值(name=value)形式定义。因此,在系统中,环境是“名称-值”的成对集合,可存储任何信息。常将列表中的名称称为环境变量(environment variables)。
环境变量的常见用途之一是在 shell 中。通过在自身环境中放置变量值,shell 就可确保把这些值传递给其所创建的进程,并以此来执行用户命令。例如,环境变量 SHELL 被设置为 shell程序本身的路径名,如果程序需要执行 shell 时,大多会将此变量视为需要执行的 shell 名称。
大多数 shell 使用 export 命令向环境中添加变量值。$ SHELL=/bin/bash Create a shell variable $ export SHELL Put variable into shell process's environment
printenv 命令显示当前的环境列表,此处是其输出的一例:
$ printenv LOGNAME=mtk SHELL=/bin/bash HOME=/home/mtk PATH=/usr/local/bin:/usr/bin:/bin:/ TERM=xterm
在 C 语言程序中,可以使用全局变量 char **environ
访问环境列表。(C 运行时启动代码定义了该变量并以环境列表位置为其赋值。)environ 与 argv 参数类似,指向一个以 NULL
结尾的指针列表,每个指针又指向一个以空字节终止的字符串。
(1) 编写一个C语言程序,该程序接受一个环境变量名称作为命令行参数,并输出该环境变量的值。如果环境变量不存在,则输出 "Variable not found"。
(2) 编写一个C语言程序,该程序将当前环境中的所有环境变量名称和值进行转置,即将每个环境变量的名称和值互换,并将其作为新的环境变量保存到一个新的环境列表中。最后,程序输出新的环境列表。
(3) UNIX I/O 模型的显著特点之一是其输入/输出的通用性概念。这意味着使用 4 个同样的系统调用 open()、read()、write()和 close()可以对所有类型的文件执行 I/O 操作,包括终端之类的设备。因此,仅使用这些系统调用编写的程序,将对任何类型的文件有效。请编写一个C语言程序,该程序接受一个文件名作为命令行参数,并统计文件中的单词数量、行数和字符数。程序应输出这些统计数据。(提示:单词之间的间隔包含哪些字符?)
0 条评论