进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。
程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,
一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。
线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。
进程与线程区别
地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。
同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程是处理器调度的基本单位,但是进程不是。
两者均可并发执行。
优缺点:
线程执行开销小,但是不利于资源的管理和保护。
进程执行开销大,但是能够很好的进行资源管理和保护。
//二分查找算法
//二分查找算法,前提是数组是有序的
//非递归方法
#include <stdio.h>
int BinarySearch(int array[], int len, int findData)
{
if(array == NULL||len<=0)
return -1;
int start = 0;
int mid = 0;
int end = len-1;
while(start<=end)
{
mid = start + (end-start)/2;
if(array[mid]==findData)
return mid;
else if(findData<array[mid])
end = mid-1;
else
start = mid + 1;
}
return -1;
}
//递归方法
int BinarySearchRecursion(int array[], int findData, int start, int end)
{
if(start>end)
return -1;
int mid = start + (end-start)/2;
if(array[mid]==findData)
return mid;
else if(findData<array[mid])
return BinarySearchRecursion(array, findData,start,mid-1);
else
return BinarySearchRecursion(array, findData, mid+1,end);
}
int BinarySearchRecursion(int array[], int len, int findData)
{
if(array == NULL||len<=0)
return -1;
return BinarySearchRecursion(array, findData, 0, len-1);
}
//找出数组中出现次数最多的元素
//使用map表
#include <iostream>
#include <map>
using namespace std;
bool findMostFrequentInArray(int* a, int size, int &val)
{
if(size==0)
return false;
map<int, int>m;
for(int i=0;i<size;++i)
{
if(++m[a[i]]>=m[val])
val = a[i];
}
return true;
}
泛型编程
指多种类型皆可操作,包括模板函数、模板类、STL标准库
vector会开辟一段连续内存空间,随机访问的效率较高
list会开辟一段不连续的空间,使用双向链表实现,其插入和删除的效率较高。