https://chelseashin.tistory.com/40

 

[OS] 뮤텍스(Mutex)와 세마포어(Semaphore)란?

프로세스 간 메시지를 전송하거나, 공유메모리를 통해 공유된 자원에 여러 개의 프로세스가 동시에 접근하면 Critical Section 문제가 발생할 수 있다. 이를 해결하기 위해 데이터를 한 번에 하나의

chelseashin.tistory.com

 

뮤텍스: 한 쓰레드, 프로세스에 의해 소유될 수 있는 Key🔑를 기반으로 한 상호배제기법

세마포어: Signaling mechanism. 현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성하는 기법

 

두 기법 모두 완벽한 기법은 아니다. 이 기법들을 쓰더라도 데이터 무결성을 보장할 수 없으며 데드락이 발생할 수도 있다. 하지만 상호배제를 위한 기본적인 기법이며 여기에 좀 더 복잡한 매커니즘을 적용해 꽤나 우아하게 동작하는 프로그램을 짤 수 있다.

----------------------------

 

프로세스 간 메시지를 전송하거나, 공유메모리를 통해 공유된 자원에 여러 개의 프로세스가 동시에 접근하면 Critical Section 문제가 발생할 수 있다.

이를 해결하기 위해 데이터를 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을 취해야 한다.

동기화 도구에는 대표적으로 뮤텍스(Mutex) 세마포어(Semaphore)가 있다.

이들은 모두 공유된 자원의 데이터를 여러 스레드/프로세스가 접근하는 것을 막는 역할을 한다.

 

뮤텍스와 세마포어에 대해 공부하기 전에, 용어 하나 알고 가자.

임계 영역(Critical Section)

여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 블록

즉, 여러 프로세스가 동일 자원을 동시에 참조하여 값(공유하는 변수명, 파일 등)이 오염될 위험 가능성이 있는 영역

프로그래밍 시, 성능 향상을 위해 임계영역을 최소화하는 설계를 해야 한다.

 


뮤텍스(Mutex)

동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘

  • 임계구역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이 서로 겹치지 않고 각각 단독으로 실행(상호배제_Mutual Exclution)되도록 하는 기술
  • 한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법
    • Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다.
  • 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화(Synchronization) 또는 락(Lock)을 사용.
  • 즉, 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.

Mutex


세마포어(Semaphore)

멀티 프로그래밍 환경에서 공유된 자원에 대한 접근을 제한하는 방법 

  • 공유자원의 상태를 나타낼 수 있는 카운터로 생각할 때,
    • 사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.
    • 운영체제 또는 커널의 한 지정된 저장장치 내의 값
    • 일반적으로 비교적 긴 시간을 확보하는 리소스에 대한 이용
    • 유닉스 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화하는 기술
  • 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있다.
  • 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다.
  • 자원을 사용하지 않는 상태가 될 때, 대기하던 프로세스가 즉시 자원을 사용한다.
  • 이미 다른 프로세스에 의해 사용중이라는 사실을 알게 되면, 재시도 전에 일정시간 대기해야 한다.
  • 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 대기하도록 해야 한다.
  • 세마포어는 이진수를 사용하거나 추가적인 값을 가질 수 있다.

 

Semaphore


뮤텍스와 세마포어의 차이점

  1. 가장 큰 차이점은 동기화 대상의 갯수이다.
    1. Mutex는 동기화 대상이 only 1개일 때 사용
    2. Semaphore는 동기화 대상이 1개 이상일 때 사용
  2. 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
    1. Mutex는 0, 1로 이루어진 이진 상태를 가지므로 Binary Semaphore!
  3. Mutex는 자원 소유 가능 + 책임을 가지는 반면, Semaphore는 자원 소유 불가
    1. 뮤텍스는 상태 0, 1 뿐이므로 Lock 가질 수 있음
  4. Mutex는 소유하고 있는 스레드만이 이 Mutex를  해제할 수 있다.
    1. 반면, Semaphore는 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다.
  5. Semaphore는 시스템 범위에 걸쳐 있고, 파일 시스템 상의 파일로 존재한다.
    1. 반면, Mutex는 프로세스의 범위를 가지며 프로세스 종료될 때 자동으로 Clean up 된다.

 

뮤텍스와 세마포어는 모두 완벽한 기법은 아니므로, 데이터 무결성을 보장할 수 없으며 모든 교착 상태를 해결하지는 못한다.

하지만, 상호배제를 위한 기본적인 기법이며 여기에 좀 더 복잡한 매커니즘을 적용해 개선된 성능을 가질 수 있도록 하는 것이 중요하다.


<참고 링크>

내가 뮤텍스와 세마포어를 이해하는데 큰 도움을 준 블로그가 있다.

공유자원을 화장실로 하여 예시를 든 글인데 이 글을 읽어주는 감사한 분들에게도 도움이 되지 않을까 하여 살짝 남긴다.

worthpreading.tistory.com/90

 

뮤텍스(Mutex)와 세마포어(Semaphore)의 차이

이 글은 Medium에 개시된 글입니다. Medium에서 보시면 좀 더 유쾌한 환경에서 글을 보실 수 있습니다. 뮤텍스(Mutex)와 세마포어(Semaphore)의 차이 Toilet problem 동시성 프로그래밍의 가장 큰 숙제는 ‘공

worthpreading.tistory.com

 

'개발' 카테고리의 다른 글

Python requests 버프 캡처  (0) 2022.01.17
python 캡처2 (펌)  (0) 2022.01.17
Python 캡처 (펌)  (0) 2022.01.17
Python logging 사용하기(펌)  (0) 2022.01.02
mysql 외부 접속 및 허용 제거 (경로 참고)  (0) 2021.11.22
블로그 이미지

wtdsoul

,

 

https://hackcatml.tistory.com/19

 

Python Burp Proxy

python requests 모듈 사용시 다음과 같은 코드를 삽입하여 요청 응답 패킷을 버프로 캡쳐가능 import os proxy = '127.0.0.1:8080' #환경 변수 설정 os.environ['HTTP_PROXY'] = proxy os.environ['HTTPS_PROXY']..

hackcatml.tistory.com

 

python requests 모듈 사용시 다음과 같은 코드를 삽입하여 요청 응답 패킷을 버프로 캡쳐가능

import os
proxy = '127.0.0.1:8080'
#환경 변수 설정
os.environ['HTTP_PROXY'] = proxy
os.environ['HTTPS_PROXY'] = proxy
os.environ['REQUESTS_CA_BUNDLE'] = "C:\\Users\\hackcatml\\Desktop\\burpSuite\\cacert.pem" #인증서 위치

 

사전에 .pem 포맷의 버프 인증서가 필요함

burp에서 인증서 export하게 되면 .der 포맷임

cmd에서 다음 명령어로 .pem포맷 인증서로 변경

openssl x509 -inform der -in cacert.der -out cacert.pem 

 

다음 예제는, https://webhacking.kr에 requests모듈을 이용하여 GET, POST 전송하되 버프 프록시를 거쳐가게 하는 코드(문제풀이와는 무관)

import requests
import os
from bs4 import BeautifulSoup

proxy = '127.0.0.1:8080'
#환경 변수 설정
os.environ['HTTP_PROXY'] = proxy
os.environ['HTTPS_PROXY'] = proxy
os.environ['REQUESTS_CA_BUNDLE'] = "C:\\Users\\hackcatml\\Desktop\\burpSuite\\cacert.pem" #인증서 위치

url = 'https://webhacking.kr/challenge/code-4/'	# https 사이트
id = 'admin'
cmt = 'love'

res = requests.get(url)
parse = BeautifulSoup(res.content, 'html.parser')
captcha = parse.find('input', {'name': 'captcha_'}).get('value')

payload = f'id={id}&cmt={cmt}&captcha={captcha}'
custom_header = {'Cookie': 'PHPSESSID=04agjetkpqrhbvgijmctrfa8c3;'}

res = requests.post(url, data = payload, headers = custom_header)

 

실행하고 BurpSuite에서 HTTP history 확인

 

 

'개발' 카테고리의 다른 글

뮤텍스(Mutex)와 세마포어(Semaphore)란?  (0) 2022.10.22
python 캡처2 (펌)  (0) 2022.01.17
Python 캡처 (펌)  (0) 2022.01.17
Python logging 사용하기(펌)  (0) 2022.01.02
mysql 외부 접속 및 허용 제거 (경로 참고)  (0) 2021.11.22
블로그 이미지

wtdsoul

,

python 캡처2 (펌)

개발 2022. 1. 17. 10:39

http://apollo89.com/wordpress/?p=1964

 

scapy를 이용한 http network 패킷 분석 프로그램 » Apollo89.com

우선은 sniffing 하지 않고 그냥 pcap 파일을 읽어서 하는 방식으로 작업했다. (PacketInside.com 의 Examples 을 입맛에 맞게 수정했다.) pcap의 파일에서 200개의 패킷을 읽어서 http의 request와 response 의 특정

apollo89.com

 

'개발' 카테고리의 다른 글

뮤텍스(Mutex)와 세마포어(Semaphore)란?  (0) 2022.10.22
Python requests 버프 캡처  (0) 2022.01.17
Python 캡처 (펌)  (0) 2022.01.17
Python logging 사용하기(펌)  (0) 2022.01.02
mysql 외부 접속 및 허용 제거 (경로 참고)  (0) 2021.11.22
블로그 이미지

wtdsoul

,

Python 캡처 (펌)

개발 2022. 1. 17. 10:17

https://taesun1114.tistory.com/entry/Python-%ED%8C%A8%ED%82%B7-%EC%BA%A1%EC%B3%90with-pypcap

 

Python 패킷 캡쳐(with. pypcap)

python 내 패킷 캡쳐를 위한 라이브러리로 pypcap을 통해 손쉽게 캡쳐 및 가공이 가능합니다. 다만 pypcap에 대한 자료가 많지않아서 원하는 함수나 기능을 사용하기엔 제약이 있습니다 :/ pypcap installa

taesun1114.tistory.com

 

python 내 패킷 캡쳐를 위한 라이브러리로 pypcap을 통해 손쉽게 캡쳐 및 가공이 가능합니다.

다만 pypcap에 대한 자료가 많지않아서 원하는 함수나 기능을 사용하기엔 제약이 있습니다 :/

 

pypcap installation

pip install pypcap

 

※ libpcap-dev 의존성을 가지고 있으므로 pypcap 설치전에 libpcap-dev가 설치되어 있어야  함

apt-get install libpcap-dev

 

pypcap 설치 후 python 실행 > import pcap 을 통해 에러가 발생하지 않는다면 정상적으로 설치가 된 것입니다.

 

Example Code 

import pcap
import re
import dpkt
import socket

sniffer = pcap.pcap(name=None,promisc=True,immediate=True,timeout_ms=50) # name=eth, None 일경우 모든 default / promisc는 모든 eth에서 패킷 수집 
sniffer.setfilter('tcp and port 80') # set packet filter

for t, p in sniffer:
    eth = dpkt.ethernet.Ethernet(p)
    ip = eth.data
    tcp = ip.data
    try:
        if len(tcp.data) > 0:
            req = dpkt.http.Request(tcp.data)	#Request패킷만 추출
            print("----------------------------------------------------------------")
            print(req)	# 패킷 출력
            print("----------------------------------------------------------------")
    except:
        pass

 

 

'개발' 카테고리의 다른 글

Python requests 버프 캡처  (0) 2022.01.17
python 캡처2 (펌)  (0) 2022.01.17
Python logging 사용하기(펌)  (0) 2022.01.02
mysql 외부 접속 및 허용 제거 (경로 참고)  (0) 2021.11.22
php mysql 명령어  (0) 2021.11.22
블로그 이미지

wtdsoul

,

https://jjig810906.tistory.com/9

 

Python logging 사용하기

Python logging 사용하기 python으로 개발하면서 로그를 남기고 저장하기위한 기본 모듈인 logging에 대한 설명이다. logging 모듈을 사용하는 방법은 아래와 같다. debug, info, warning, error, critical 5단계..

jjig810906.tistory.com

 

Python logging 사용하기

python으로 개발하면서 로그를 남기고 저장하기위한 기본 모듈인 logging에 대한 설명이다.

 

logging 모듈을 사용하는 방법은 아래와 같다.

debug, info, warning, error, critical 5단계로 로그를 구분하여 등록 할 수 있다.

import logging


logging.debug("test debug log")
logging.info("info log")
logging.warning("warring !!!!")
logging.error("bug bug bug bug")
logging.critical("critical !! ~~")

위 코드를 실행하면 warning, error, critical 에 해당하는 로그만 출력된다.

이유는 기본설정이 warning 이상의 로그만 출력되도록 설정되어있다.

 

모든 로그가 출력되도록 하려면

import logging 아래 다음 코드를 넣어준다.

logging.basicConfig(level=logging.DEBUG) #기본값은 warning (warning 이상의 로그만 출력됨)

이제 코드를 실행하면 입력한 모든 로그가 콘솔에 출력된다.

 

 

로그를 콘솔에 출력하지 않고 파일에 저장하려면 아래와 같이 filename 정보를 넣어주면 된다.

logging.basicConfig(filename='./test.log', level=logging.DEBUG) #기본값은 warning (warning 이상의 로그만 출력됨)

 

 

이렇게 로그를 저장하게 되면 하나의 파일에 용량이 커지게되고, 나중에 파일 용량이 너무 커서 열지 못하는 문제가 발생 할 수 있다.

이런 문제를 해결하기위해 RotatingFileHandler를 사용하여 로그저장파일의 크기가 커지면 다른파일에 등록하도록 할 수 있다.

import logging
from logging.handlers import RotatingFileHandler


logger = logging.getLogger(__name__)
fileHandler = RotatingFileHandler('./myLogger.log', maxBytes=1024*5, backupCount=5)
fileHandler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] [%(filename)s:%(lineno)s] >> %(message)s'))
logger.addHandler(fileHandler)
logger.setLevel(logging.DEBUG)



logger.debug("test debug log")
logger.info("info log")
logger.warning("warring !!!!")
logger.error("bug bug bug bug")
logger.critical("critical !! ~~")

전체 코드는 위와 같고

 

중요한 부분은 아래와 같다.

RotatingFileHandler('./myLogger.log', maxBytes=1024*5, backupCount=5)

maxByte = 해당 용량이상이 되면 해당파일을 백업하고 새로운 파일에 로그를 저장한다.

backupCount = 백업된 파일을 몇개 유지할것인지 설정한다. (5로 설정되면 5개의 백업파일을 유지한다.)



출처: https://jjig810906.tistory.com/9 [프로그램마귀]

'개발' 카테고리의 다른 글

python 캡처2 (펌)  (0) 2022.01.17
Python 캡처 (펌)  (0) 2022.01.17
mysql 외부 접속 및 허용 제거 (경로 참고)  (0) 2021.11.22
php mysql 명령어  (0) 2021.11.22
new bufferedoutputstream(response.getoutputstream()) resource leak  (0) 2021.11.04
블로그 이미지

wtdsoul

,

 

http://blog.servis.co.kr/index.php/2019/06/28/mysql-not-allowed-to-connect/

 

mysql 외부접속 허용및 제거

웹서버와 디비서버를 분리할경우 외부에서 mysql에 접속하려면 외부접속 권한이 필요하다   일반적으로 외부접속 권한이 없을시 아래와 같은 메시지가 나옴 ERROR 1130 (HY000): Host '192.168.0.10' is not a

blog.servis.co.kr

 

mysql 외부접속 허용및 제거

웹서버와 디비서버를 분리할경우 외부에서 mysql에 접속하려면 외부접속 권한이 필요하다

 

일반적으로 외부접속 권한이 없을시 아래와 같은 메시지가 나옴
ERROR 1130 (HY000): Host ‘192.168.0.10’ is not allowed to connect to this mysql server

mysql 서버에서 콘솔로 접속해서 권한을 확인해보면 localhost 나  127.0.0.1  로 등록 되어있는걸 확인할수 있다

mysql> use mysql
mysql> select host, user, password from user;

권한설정
모든 ip허용
% 는 모든ip를 허용하지만 localhost는 포함되지 않음
mysql> GRANT ALL privileges ON *.* TO 아이디@’%’ IDENTIFIED BY ‘패스워드’;

특정ip허용
mysql> GRANT ALL privileges ON *.* TO 아이디@’111.111.111.111′ IDENTIFIED BY ‘패스워드’;

설정적용
mysql> FLUSH privileges;

 

2. 권한 설정 하기
설정을 할 때, 특정 IP나 특정 IP대역만 허용을 하거나, 전체를 허용되게 하는 방법이 있습니다.
1) 특정 IP 접근 허용 설정
mysql> grant all privileges on *.* to ‘root’@‘192.168.56.101’ identified by ‘root의 패스워드’;
2) 특정 IP 대역 접근 허용 설정
mysql> grant all privileges on *.* to ‘root’@‘192.168.%’ identified by ‘root의 패스워드’;
3) 모든 IP의 접근 허용 설정
mysql> grant all privileges on *.* to ‘root’@‘%’ identified by ‘root의 패스워드’

 

외부접속 허용제거
% 모든아이피 허용제거
mysql> DELETE FROM mysql.user WHERE Host=’%’ AND User=’아이디’;

특정ip허용 제거
mysql> DELETE FROM mysql.user WHERE Host=’111.111.111.111′ AND User=’아이디’;

설정적용
mysql> FLUSH privileges;

 

외부접속 확인방법
mysql -h 111.111.111.111 -u servblog -p
설정이 바르게 적용됬으면 정상적으로 접속되는걸 확인할수 있다

mysql 서버에  iptables 에서 mysql포트가 차단되어 있는지 확인한다
my.cnf 파일에 아래와 같은 설정이 있을시 삭제한다
bind-address = 127.0.0.1

 

1.데이터 베이스 접속하기
mysql -u 사용자명 -p 데이터베이스이름
mysql -u root (계정과 비번을 만들지 않았을때)
mysql -u root -p(루트 비번이 있을때)

2.데이터베이스 추가 
mysqladmin -u root -p create 데이터베이스명

3.루트 계정비밀번호 바꾸기
mysqladmin -u root -p password 새비밀번호
mysqladmin -u root password 비밀번호(비밀번호를 처음 설정시)

4.사용자추가 및 권한 설정
사용자계정:abc , 사용자 패스워드:1234

접속 : mysql -u root -p

mysql> USE mysql;

mysql> INSERT INTO user (Host, User, Password) VALUES ('localhost', '계정아이디', password('비밀번호'));
mysql> INSERT INTO user (Host, User, Password) VALUES ('%', '계정아이디', password('비밀번호'));
mysql> FLUSH privileges;

계정이 생성되었다면, 그 계정이 접근할 수 있는 데이터베이스를 생성하고 권한을 부여해야 합니다.

mysql> CREATE DATABASE 데이터베이스명;
mysql> GRANT ALL privileges ON 데이터베이스명.* TO 계정아이디@locahost IDENTIFIED BY '비밀번호';
mysql> GRANT ALL privileges ON 데이터베이스명.* TO 계정아이디@'%' IDENTIFIED BY '비밀번호';

5.테이블 생성
create table test;

6.테이블 삭제
drop table test;

7.현재상태보기
status;

8.테이블목록보기
show tables;

9.데이터베이스 목록보기
show databases;

10.테이블구조보기 
explain tablesname;

11.데이터베이스 삭제 
drop database jsp

*체크*

우선, 기본적으로 mysql 은 tcp 3306 번 포트를 통해 서비스를 제공합니다.

따라서, 외부에서 DB에 접근할 수 있도록 하기 위해서는

서버의 tcp 3306 번 포트가 방화벽에 막혀 있지는 않은지 확인해야 하며

만약 막혀 있을 경우 열어주어야 합니다.

iptables -L 명령으로 차단/허용 리스트 조회가 가능합니다. 만약 포트가 막혀 있을 경우,

# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

명령으로 열어주시면 됩니다.



출처: https://vkein.tistory.com/entry/MySQL-접속-명령어 [기록하며 성장하기]

 

'개발' 카테고리의 다른 글

Python 캡처 (펌)  (0) 2022.01.17
Python logging 사용하기(펌)  (0) 2022.01.02
php mysql 명령어  (0) 2021.11.22
new bufferedoutputstream(response.getoutputstream()) resource leak  (0) 2021.11.04
Spring Boot  (0) 2021.08.13
블로그 이미지

wtdsoul

,

php mysql 명령어

개발 2021. 11. 22. 16:23

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=standcode&logNo=220238046729

 

Php MySql관련 명령어

이번 포스팅은 Php MySql관련 명령어 입니다. 가. MYSQL 데이터베이스 1. MYSQL 명...

blog.naver.com

 

 

블로그 이미지

wtdsoul

,

https://eblo.tistory.com/6

 

Use try-with-resources or close this "BufferedInputStream" in a "finally" clause

Use try-with-resources or close this "BufferedInputStream" in a "finally" clause. DB Connection, InputStream, file, URLConnection 등 Closeable 인터페이스를 구현 또는 상속받은 클래스는 반드시 finally..

eblo.tistory.com

 

 

'개발' 카테고리의 다른 글

mysql 외부 접속 및 허용 제거 (경로 참고)  (0) 2021.11.22
php mysql 명령어  (0) 2021.11.22
Spring Boot  (0) 2021.08.13
[C언어/C++] strcpy, strncpy 함수(문자열 복사)  (0) 2021.06.06
오버로딩과 오버라이딩  (0) 2020.08.11
블로그 이미지

wtdsoul

,

Spring Boot

개발 2021. 8. 13. 00:35

https://gist.github.com/ihoneymon/a343e2f4a0299988206e

 

스프링부트springboot 이야기

스프링부트springboot 이야기. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

 

'개발' 카테고리의 다른 글

php mysql 명령어  (0) 2021.11.22
new bufferedoutputstream(response.getoutputstream()) resource leak  (0) 2021.11.04
[C언어/C++] strcpy, strncpy 함수(문자열 복사)  (0) 2021.06.06
오버로딩과 오버라이딩  (0) 2020.08.11
LLVM 이란  (0) 2020.08.10
블로그 이미지

wtdsoul

,

https://blockdmask.tistory.com/348

 

[C언어/C++] strcpy, strncpy 함수(문자열 복사)에 대해서

안녕하세요. BlockDMask 입니다. 오늘은 C 스타일의 문자열인 char*, char[] 타입의 문자열을 복사하는 함수 두가지에 대해서 알아 볼 것 입니다. 두 함수는 바로 strcpy, strncpy 입니다. 이 두함수가 무슨

blockdmask.tistory.com

 

참고

 

'개발' 카테고리의 다른 글

new bufferedoutputstream(response.getoutputstream()) resource leak  (0) 2021.11.04
Spring Boot  (0) 2021.08.13
오버로딩과 오버라이딩  (0) 2020.08.11
LLVM 이란  (0) 2020.08.10
함수의 호출방식  (0) 2020.08.10
블로그 이미지

wtdsoul

,