面试基础-linux操作系统篇

1.Sed

sed -e '4 a newline' testfile:4 行之后添加一行

sed -n '5,7p':仅列出 /etc/passwd 文件内的第 5-7 行

如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎么办?就利用 sed !

sed -i '$a # This is a test' regular_express.txt

利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test



2.线程、进程、协程

操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。

线程,是操作系统调度(CPU调度)执行的最小单位。
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。协程在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。



3.线程在操作系统中有堆区栈区代码段全局变量等等,哪些是共享的哪些独有

线程上下文是独有的,thread context。我们也说过操作系统调度线程需要随时中断线程的运行并且需要线程被暂停后可以继续运行,操作系统之所以能实现这一点,依靠的就是线程上下文信息。

比如:由于操作系统随时可以暂停线程的运行,因此我们保存以及恢复程序计数器中的值就能知道线程是从哪里暂停的以及该从哪里继续运行了。由于线程运行的本质就是函数运行,函数运行时信息是保存在栈帧中的,因此每个线程都有自己独立的、私有的栈区。

再比如:函数运行时需要额外的寄存器来保存一些信息,像部分局部变量之类,这些寄存器也是线程私有的,一个线程不可能访问到另一个线程的这类寄存器信息。

共享的:堆区,数据区和代码区。堆区是程序员比较熟悉的,我们在C/C++中用malloc或者new出来的数据就存放在这个区域。

进程打开的文件也可以被所有的线程使用,这也属于线程间的共享资源。



4.操作系统内存管理方式

操作系统内存管理——分区、页式、段式管理

分区式存储管理:把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。分区式存储管理虽然可以支持并发

连续内存分配:连续内存分配算法有首次适配,最佳适配,最差适配。

  • 首次适配:按地址排序的空闲块列表;
  • 最佳适配:按尺寸,使用最小的比n大的可用空闲块;
  • 最差适配:使用最大可用空闲块

非连续内存分配

  • 分段:段寄存器+地址寄存器,在分段管理的过程中,段长不是固定的。
  • 分页:内存分页,通过某种方式,将虚拟地址映射到物理地址,映射的关系是通过一张表实现的,也就是页表。


5.进程通信方式及应用场合

进程调度方式,linux用的哪种???

进程是一个程序的一次执行过程。

管道,相当于开辟的内存缓冲区,起数据传递的作用

信号量 一个计数器

消息队列:消息的链表

信号,用于通知进程发生了哪些系统事件

共享内存,多个进程可以直接读写同一块内存空间

嵌套字



6.僵尸进程、孤儿进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作;

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。



7.查看io的命令

top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了

Iostat: 用于输出CPU和磁盘I/O相关的统计信息



8.32位系统大概有2^32约为4G的大小,为什么虚拟内存可以才2G

虚拟内存是windows管理所有可用内存的方式,对于32位Windows系统,每个进程所用到的虚拟内存地址从0到2^32-1,总容量4Gb,其中2Gb是与操作系统以及其他所有进程所共享,另外2GB分派给进程独占(这就是常说的32位Windows系统中一个进程最多能用2G内存的由来)



9.vim如何进行批量修改

正则表达式

:s/vivian/sky/ 替换当前行第一个 vivian 为 sky

:s/vivian/sky/g 替换当前行所有 vivian 为 sky

10.Linux采用的命令

1.查找包含abc的行数有多少

cat ./aaa.data |grep abc| wc -l

2.kill命令参数

  • 1 (HUP):重新加载进程。
  • 9 (KILL):杀死一个进程。
  • 15 (TERM):正常停止一个进程。

3.查看文件中是否有某个字符串的命令:

cat ./aaa.data |grep abc

4.文档中每一行都是字符串,有些行是重复的,如何找出并显示不重复的行

sort file |uniq

5.给定一个C文件,如何用一个命令找到文件中的一行或者一个字符?

sed -n '5,10p' filename 这样你就可以只查看文件的第5行到第10行。

6.删除指定后缀的文件

find . -name “*.png” | xargs rm -rf

7.awk 以逗号分割输入第三列

cat temp.txt |awk ‘BEGIN{ORS=”,”} {print $3}’

posted @ 2021-04-25 19:46  Super_orange  阅读(127)  评论(0编辑  收藏  举报