进程与线程(1)
1.What is the difference between fork and exec? please use programs to prove your opinion.
答:Fork是创建一个新的进程(把进程原样复制一个新的出来),新进程和老进程相同只有进程号不同。但是exec用参数指定的程序代替当前进程的内容,也就是执行新的程序,它会将指定程序的代码段和数据段覆盖当前进程。
#include<unistd.h>
#include<stdio.h>
int main()
{
pid_t pid;
pid = fork();
if(pid == 0)
{
while(1)
{
sleep(1);
printf("123\n");
}
}
if(pid > 0)
{
while(1)
{
sleep(1);
printf("456\n");
}
}
}
#include<unistd.h>
#include<stdio.h>
int main()
{
pid_t pid;
pid = fork();
execl("/home/user/a.out",0);
if(pid == 0)
{
while(1)
{
sleep(1);
printf("hello123\n");
}
}
if(pid > 0)
{
while(1)
{
sleep(1);
printf("hello456\n");
}
}
}
2.In which condition will a user program trap into the kernel?
答:①系统调用:这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序来完成工作,而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的ine 80中断。
②异常:当CPU 在执行运行用户态的程序时,发现了某些事件不可知的异常,这时会触发由当前运行进程切换到批处理异常的内核相关程序中,也就到了内核态,比如缺页异常。
③外围设备的中断:当外围设备完成用户请求的操作之后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条将要执行的指令转而去执行中断信号的处理程序,如果先执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
从出发方式来看,可以认为存在上述三种不同的类型,但是从最终实际完成由用户态切换到内核态的操作上来说,涉及的关键步骤是完全一样的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断处理的机制基本上是一样的。
3.What is shell?
答:UNIX的命令解释器称为Shell。Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
4.What are four events for process creation? (use example that could run in Linux to verify it)
答:有四种主要事件导致进程的创建:
①系统初始化
②执行了正在运行的进程所调用的进程创建系统调用
③用户请求创建一个新进程
④一个批作业处理的初始化
#include<unistd.h>
#include<stdio.h>
int main()
{
int pid;
pid = fork();
if(pid == 0)
{
printf("new process is create!");
}
}
//process is create!
5.What are four conditions for process termination?(use exampe that could run in Linux to verify it)
答:进程终止通常由下列条件引起:
①正常退出(自愿的)
#include<unistd.h>
#include<stdio.h>
int main()
{
printf("hello world!\n");
}
//process is over
②出错退出(自愿的)
#include<unistd.h>
#include<stdio.h>
int main()
{
int i=10;
while(1)
{
printf("%d\n",10/i);
sleep(2);
i--;
}
}
//process error
③严重错误(非自愿)
④被其他进程杀死(非自愿)
6.What is the internal structure of a process?
答:进程的内部结构:代码段code segment、数据段data segment、堆栈段stack、地址空间adress space、进程控制块PCB process control block
7.What is a thread and what's the difference between thread & process?
答:Thread 线程 (lightweight process) 是进程中的一个代码片段,可以和其他的(该进程的)代码片段并发运行。
区别:
(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元。
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束。
(4)线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的。
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源。
(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志。
8.What is the difference between User Space and Kernel space?
答:应用程序正常情况下都是运行在普通模式下,这部分代码运行的空间称为用户空间,当代码通过系统调用计入到特权级别运行的时候,对应的代码执行空间称为内核空间。
内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在0级特权级上时,就可以称之为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。
处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的;而处于内核态执行的进程,则能访问所有的内存空间和对象,且所占有的处理机是不允许被抢占的。
9.The UNIX_____ is called the shell.
答:UNIX的命令解释器称为shell,bash是shell的一种,Linux上默认采用的是bash。