摘要: 同步:所谓同步,就是指发出一个功能调用时,在没有得到结果之前,该调用就不返回;也就是说必须一件一件的,等前一件事做完再做下一件事。异步:异步就是和同步的概念是相对应的。当一个异步过程调用发生后,调用者不能立刻得到结果,该调用就返回。实际处理这个调用的部件在完成后,通过状态、通知和回调函数来通知调用者。阻塞:阻塞调用是指调用过程返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停执行)。函数只有在得到结果之后才会返回。非阻塞:非阻塞为是相对与阻塞的,指在不能立刻得到返回结果之前,该函数不会阻塞当前的线程,而会立即返回。(1)同步,就是我调用一个功 阅读全文
posted @ 2014-03-27 21:30 herry_tu 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 1. 索引通常是设置where字句中的列,如果你设置select后的列,这是没有任何意义的。当然你需要对某列进行排序,order by后的列也是可以建成索引的。2. 使用唯一索引,主键就是最好的例子,假设你建的索引列,大量都是重复的,例如:性别,那么这样的索引并不会加快搜索速度。至于为什么,请大家自行了解索引的工作理。3. 只要有可能,就要尽量限定索引的长度,例如索引列为char(100),在其前10个字符大部分都是唯一的,请设置索引的长度为10,使用短索引可以加快查询速度,并节省硬盘空间。4. 索引的左前缀特性,联合索引实质上也是建立了多个的索引,那么是建立联合索引好还是分别建多个索引好呢? 阅读全文
posted @ 2014-03-27 21:13 herry_tu 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 线程是进程的实体,是CPU调度和分配的基本单位,线程自己基本上不拥有系统资源,只用有一点在运行中必不可少的资源(如程序计数器,寄存器和栈),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一进程中的多个线程之间可以并发执行。相对于进程而言,线程是一个更加接近于执行体的念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在用户看来,多线程是同时执行的。但从操作系统来看,各个线程是交替执行的。系统不停的在各个线程之间切换,每个线程只有在系统分配给他的时间片内才能获得CPU的控制权,执行程序中的代码。进程和线程的区别(1)线程 阅读全文
posted @ 2014-03-27 21:06 herry_tu 阅读(204) 评论(0) 推荐(0) 编辑
摘要: http://blogread.cn/it/article/3250?f=sa#original 阅读全文
posted @ 2014-03-27 20:53 herry_tu 阅读(104) 评论(0) 推荐(0) 编辑
摘要: I/O复用使的程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常网络程序在下列情况下需要使用I/O复用技术:(1)客户端程序要同时处理多个socket(2)客户端程序要同时处理用户输入和网络连接(3)TCP服务器要同时处理监听socket和连接socket(这时I/O复用使用最多的场合)(4)服务器要同时处理TCP请求和UDP请求(5)服务器要同时监听多个端口,或者处理多种服务。需要指出的是,I/O复用虽然能同时监听多个文件描述符,但是它本身是阻塞的。并且当多个文件描述符就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这使得服务器程序看起来像是串行工作 阅读全文
posted @ 2014-03-27 20:44 herry_tu 阅读(828) 评论(0) 推荐(0) 编辑
摘要: 本文转自:http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/一.基础知识:线程和进程按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。无论按照怎样的分法,一个进程至少需要一个线程作为它的指令执行体,进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。一个进程当然可以拥有多个线程,此时,如果进程运行在SMP机器上,它就可以同时使用多个cpu来执行各个线程,达到最大程度的并行,以 阅读全文
posted @ 2014-03-27 20:22 herry_tu 阅读(321) 评论(0) 推荐(0) 编辑
摘要: Linux操作系统内核态对进程线程不做严格区别 从内核角度看根本就没有线程的概念,线程仅仅被视为一个使用某些共享资源的进程如地址空间,文件系统,打开的文件,信号处理程序等 进程0 内核是一个大的程序,可以控制硬件,也可以创建、运行、终止、控制所有的进程。当内核被加载到内存后,首先就会有完成内核初始化的函数start_kernel()从无到有的创建一个内核线程swap,并设置其PID为0,即进程0;它也叫闲逛进程;进程0执行的是cpu_idle()函数,该函数仅有一条hlt汇编指令,就是在系统闲置时用来降低电力的使用和减少热的产生。同时进程0的PCB叫做init_task,在很多链表中起了表头的 阅读全文
posted @ 2013-07-29 20:59 herry_tu 阅读(2879) 评论(0) 推荐(0) 编辑
摘要: 在每个进程退出如调用exit或return的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等,但是进程并没有立马就消失,而是仍然为其保留一定的信息(包括进程号,退出状态,运行时间, 直到父进程通过wait/waitpid来处理时才进行释放。此时该进程处于僵尸状态,该进程成为僵死进程(Zombie Process)。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号, 那么它就一直保持僵死状态,此时即使是root用户也无法清理,如果这时父进程结束了,僵死的子进程成为"孤儿进程&quo 阅读全文
posted @ 2013-07-29 20:56 herry_tu 阅读(424) 评论(0) 推荐(0) 编辑
摘要: http://coolshell.cn/articles/7965.html前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的: 题目:请问下面的程序一共输出多少个“-”? 1#include2#include3#include45intmain(void)6{7inti;8for(i=0;i0,则是父进程(返回值是子进程的pid),这是众为周知的。 还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量, 阅读全文
posted @ 2013-07-24 15:42 herry_tu 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 首先它们最终都调用了内核里的do_fork()函数,然后完成了下述操作 1、调用alloc_task_struct()函数申请8KB的内核栈内存空间,供新建进程使用; 2、让指针指向父进程的PCB,然后将父进程的PCB内容拷贝到给新进程分配的PCB中去,此时父子进程完全相同,当然拷贝内容包括了:指令,变量值,程序调用栈,缓存区,环境变量等等,而此时若搭配一些有缓存的语句,就会出现意想不到的结果了,这是后话。 3、检查创建该进程后,是否越界,即该用户所拥有的进程数目是否超过了给它分配的资源的限制; 4、然后就是建立新创建的子进程的新的,独有资源,并且通知内核此进程已经诞生。 5、设置子进程的状态 阅读全文
posted @ 2013-07-24 15:29 herry_tu 阅读(1435) 评论(0) 推荐(0) 编辑