一、创建进程
在Linux系统中,只有fork()系统调用能够创建进程。调用fork()函数之后,父进程将寄存器和堆栈内的内容全部赋值给子进程的寄存器和堆栈。
</pre><pre name="code" class="cpp">/*
* fork_test.c
* version 1
* Created on: 2015-5-18
* Author: wangth
*/
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n",getpid());
count++;
}
else {
printf("i am the parent process, my process id is %d/n",getpid());
count++;
}
printf("统计结果是: %d/n",count);
return 0;
}
上述代码的结果为
i am the child process, my process id is
<pre name="code" class="cpp">统计结果是:1<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
i am the parent process, my process id is
<pre name="code" class="cpp">统计结果是: 1
fork函数的返回值有3种情况
(1) 在子进程内返回0
(2) 父进程内返回大于0
(3) 当创建进程出现错误时返回的值小于0
参考别人文章get的知识:
printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有/n 则会立即刷新stdout,因此就马上能够打印了。
二、进程切换
进程切换的概念首先要涉及的是硬件上下文,每个进程都有自己的内存空间,但是进程必须共享CPU的寄存器,而进程在恢复执行前必须装入寄存器的值就被称为硬件上下文。
当磁盘产生一个中断时,而进程正在执行,此时,中断硬件将程序计数器,程序状态字,硬件上下文压入到内核态的堆栈中,随即,计算机,跳转到中断向量所指示的地址,这些操作都是由硬件完成的。随后由中断服务例程接管一切剩余的工作。
三、线程
线程是mini版的进程,其存在理由有三:
(1)需要有一种并行实体共享同一个内存空间和所有可用数据
(2)线程相对比较轻量级,所以创建和切换线程时比较轻松
(3)多线程在多CPU系统中真正实现了并行
(4)线程允许计算和IO重叠运行,加快程序执行速度
web服务器中的例子中:
一个称为分派程序的线程从网络中读入工作请求。在检查请求之后,分派线程挑选一个空转的工作线程,提交该请求,将此空转线程从阻塞状态转为就绪状态。
工作线程在被唤醒之后检查所有线程都能够访问的web页面高速缓存,如果没有则调用读硬盘的系统调用read。在调用read时,阻塞这个线程直到该线程完成read操作。在阻塞该线程的同时,分配程序选择线程就绪队列中的另一个线程进行操作。
而此时如果是单线程,则在阻塞该进程之后,服务器空转,不执行后续到来的操作,可见多线程加速了程序的执行。
进程共享物理内存和磁盘,而线程共享同一个地址空间。
POSIX线程的一些函数
/*创建一个线程,成功返回0,失败返回error错误标志*/
- int pthread_create(pthread_t * thread, //thread :线程id, unsigned long intxi型
- const pthread_attr_t *attr, //attr: 线程属性参数,创建时将根据这个参数进行线程初始化
- void *(*start_routine)(void *), //start_routine:指向线程所调用的函数
- void *arg); //arg :线程传递参数
/* 终止线程,成功返回0,失败返回error错误 标志*/
- void pthread_exit(void *retval); //retval:返回值指针
/*等待直到id为th线程运行结束(合并一个线程的意思)*/
- int pthread_join(pthread_t th, void**thread_return); // th:线程id
- // thread_return :线程终止或取消时的返回值指针
/*获取当前线程id*/
- pthread_t pthread_self(void);