29 Haziran 2018 Cuma

mmap ile Memory Mapped File

Giriş
POSIX ile Memory Mapped File işlemi yapmak için temel iki metod mmap() ve munmap()'tir.

mmap metodu
1. Dosya açılır.
int myfd = open("hello.txt", O_RDWR);
2. Bu dosyanın büyüklüğünü alırız.
struct stat mystat = {};
fstat(myfd,&mystat);
3. Büyüklüğü bir değişkene aktarırız.
off_t myfsz = mystat.st_size;
4. Daha sonra dosyayı mmap ile Memory Mapped File haline getiririz.
void*ad = mmap(NULL, myfsz, PROT_READ|PROT_WRITE, MAP_SHARED,myfd, 0);
if (ad == MMAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); };
Eğer istenirse dosyanın belli bir kısmı belleğe alınabilir.
/* Map the first 1 MB of the file. */
pMap1 = (char *)mmap(0, 1024*1024, PROT_READ, MAP_SHARED, fd, 0);
Örnek
Tam bir örnek için şöyle yaparız.
int fd = open(filename, O_RDONLY); // open file
struct stat fs;
fstat(fd, &fs);

char *buf = (char*)mmap(0, fs.st_size, PROT_READ, MAP_SHARED, fd, 0));

char *buff_end = buf + fs.st_size;

munmap(buf, fs.st_size);

close(fd);
Örnek
Eğer dosya büyüklüğü ile mmap büyüklüğü farklı ise SIGBUS hatası alınır. Elimizde şöyle bir kod olsun. dosya açılırken truncate edildiği için hata alırız.
struct rgn_desc
{
  size_t end_;
  char data[];
};

int main(int argc, const char *argv[])
{
  int fd = open("foo.mm", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0700);

  assert(fd != -1);

  void * ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
                    MAP_SHARED | MAP_POPULATE, fd, 0);

  assert(ptr != (void*) -1);

  rgn_desc * rgn_ptr = (rgn_desc*) ptr;
  rgn_ptr->end_ = 0; // <-- bus error
}

28 Haziran 2018 Perşembe

Atomic İşlemler

Giriş
Atomik işlem bölünemez (indivisible) işlem anlamına gelir. Kod parçalarını lock ile kilitlemekten daha farklı bir kavramdır. Multi-core sistemlerde atomik işlemler için çekirdekler arasında kullanılan bir protokol gerekir.

Atomik işlemler için önce iki kavramı anlamak gerek. Bunlar compiler order ve memory order. 

- İlk kavram derleyicinin kod üretirken, daha optimize olacağını düşündüğü şekilde kodların sırasını değiştirebilmesi. 
- İkinci kavram ise bir çok işlemcinin işleri paralel yürütebilmek için derleyicinin ürettiği kodu, çalışma esnasında farklı sırada çalıştırması. Bunu kontrol etmek için Memory Order kullanılır

Yani işler yazılan koddan çok farklı bir sıralamaya tabi olabiliyor.

Compare Exchange Instruction'lardan Önce
Kullanılan yöntemin açıklaması şöyle
When using a single core, code which disables interrupts and then performs a sequence of memory operations can guarantee that they will be performed atomically. Additionally, many operations like "inc" would be essentially guaranteed to be atomic in the absence of a page fault. Prior to the introduction of a "compare exchange" instruction on the 80486, this was the most practical way to perform many tasks requiring some kinds of atomic operations. Code which relies upon such techniques, however, won't run reliably in a multi-core system unless code running on different cores can be guaranteed not to act in conflicting fashion upon the same region of memory.
Compare Exchange Instructions
Atomik işlemler Compare and SwapTest and Set kümelerine bölünmüştür.

C99
C99 gibi daha eski standartlarda, concurrency  (eş zamanlılık) dahil edilmediği için, atomic değişkenler mevcut değil. Bu yüzden sadece sig_atomic_t gibi interruptability kavramlara yer verilmiş. C2011 standardında ise concurrency dahil ediliyor.

Memory Order Neden Var ?
Çalışma esnasında multi-core işlemciler RAM yavaş kaldığı için kendi önbelleklerine verinin kopyasını alırlar. Örneğin iki çekirdeğin her biri kendi L1 önbelleğinde RAM 'deki aynı veriyi tutuyor olabilir. Önbelleklerin RAM'e yazarken bir şekilde tutarlılığı sağlaması gerekir. Buna cache coherence yani önbellek tutarlılığı denilir. Önbellek tutarlılığı için kullanılan protokollerden bir tanesi MESI'dir.

Coherance Protokolleri Nasıl Çalışır?
Global coherence protokollerinde global state'i dağıtmak için iki yöntem var. İlki directory yöntemi, diğeri ise shared bus yöntemi.


Aslında işlemci ve L1 önbelleği arasında LoadBuffer, StoreBuffer gibi başka kuyruklar da var ancak, basitlik adına bu kadar detaya girmedim. Aşağıdaki şekilde bu yapılar görülebilir.

İşlemciler L2 ve RAM'i de paylaştıkları için daha sonra veriyi eşitlemeye çalışırlar, bu durum da senkronizasyon problemlerine yol açar Aşağıdaki şekilde durum görülebilir.



Memory Order
std::memory_order yazısına taşıdım.

Programlama Dillerinde Atomik Yapılar
Aşağıda bazı programlama dillerinde veya kütüphanelerde bulunan atomik yapılarla ilgili notlarım var.

Atomic Int
boost
atomic yazısına taşıdım

QT
QAtomicInt Sınıfı yazısına taşıdım.

Java
Atomic Java Yapıları yazısına taşıdım.

C#
Interlocked Sınıfı yazısına taşıdım.

Atomic Long
Java
Atomic Java Yapıları yazısına taşıdım.

Atomic Bool
C++
C++'ta atomic bool olarak kullanılabilecek iki sınıf var. Bunlar std::atomic_bool ve std::atomic_flag sınıfları.

27 Haziran 2018 Çarşamba

HLA NullFederateAmbassador Sınıfı

Giriş
Bu sınıfın en önemli kullanım amaçlarından birisi, içine Barrier alarak asenkron çalışan RTIambassador metodlarının bitmesini kolayca beklemektir.

Çağrı silsilesi şöyle

rti.connect()
rti.destroyFederationExecution()
rti.createFederationExecution()
rti.joinFederationExecution()

rti.getParameterHandleValueMapFactory()
rti.getAttributeHandleValueMapFactory()
rti.getAttributeHandleSetFactory()
rti.getFederateHandleSetFactory()

rti.enableTimeConstrained
rti.enableTimeRegulation
rti.registerFederationSynchronizationPoint //only by manager federate

  rti.subscribeInteractionClass (getInteractionClassHandle)
  rti.subscribeObjectClassAttributes : şu çağrıları yapar
 (getObjectClassHandle + getAttributeHandle + attributeHandleSetFactory.create())
 rti.publishObjectClassAttributes
 rti.registerObjectInstance

rti.synchronizationPointAchived //ready for something
rti.enableAsynchronousDelivery

while (!simulationEndReceived) {
  rti.timeAdvanceRequest
  while (!wasTimeAdvanceGrant) {
    NullFederateAmbassador.receiveInteraction -> dispatch
    NullFederateAmbassador.receiveAttributeValues -> dispatch
    NullFederateAmbassador.removeObjectInstance -> dispatch
    NullFederateAmbassador.timeAdvanceGrant -> break loop
  }
}

rti.synchronizationPointAchived //ready for something

rti.resignFederationExeution
rti.destroyFederationExeution


22 Haziran 2018 Cuma

Http Cevap Parametreleri - Response Header Fields

Giriş
Liste şöyle. Bu parametreler sadece cevap ile kullanılır.

Accept-Ranges Parametresi
Örnek ver

Age Parametresi
Örnek ver

Cache-Control Parametresi
Cache-Control parametresi hem request hem de response ile kullanılabilir. Response ile kullanırken şu değerleri alabilir
Cache-Control: must-revalidate
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: no-transform
Cache-Control: public
Cache-Control: private
Cache-Control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-Control: s-maxage=<seconds>
no-store ise sunucu tarayıcının cache'lemesini istemiyordur.
private
 Şöyledir.
HTTP/1.1 200 OK
Cache-Control: private
...
Content-Encoding Parametresi - Sıkıştırma İçindir
Bu alan gzip, deflate, br değeri alabiliyor
Örnek
gzip şöyle
Content-encoding: gzip
Tüm istek şöyle
HTTP/1.1 200 OK
Date: Mon, 29 Sep 2014 10:43:29 GMT
Content-Type: text/html
Transfer-Encoding: chunked
X-Powered-By: VideoHosting Framework/1.0.1
Cache-Control: no-cache, must-revalidate, no-cache="Set-Cookie", private
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Videohost/1.0.1
İsteği gönderen tarafın da Accept-encoding: gzip göndermesi gerekir. Çoğu modern tarayıcı gzip sıkıştırmasını açabildiği için sorun olmaz.

ETag Parametresi
Örnek ver

Location Parametresi
Örnek ver

Proxy-Authenticate Parametresi
Örnek ver

Retry-After Parametresi
Açıklaması şöyle
Servers send the "Retry-After" header field to indicate how long the user agent ought to wait before making a follow-up request.  

When sent with a 503 (Service Unavailable) response, Retry-After indicates how long the service is expected to be unavailable to the client.

When sent with any 3xx (Redirection) response, Retry-After indicates the minimum time that the user agent is asked to wait before issuing the redirected request.

The value of this field can be either an HTTP-date or a number of seconds to delay after the response is received.
Server Parametresi
Örnek ver

Strict-Transport-Security Parametresi
HTTP Strict Transport Security yazısına taşıdım

Vary Parametresi
Örnek ver

WWW-Authenticate Parametresi - Sunucu Doğrulama Yapmak İstediğini Belirtir
Açıklaması şöyle.
If the protected resource request does not include authentication credentials or does not contain an access token that enables access to the protected resource, the resource server MUST include the HTTP WWW-Authenticate response header field [...].
Sunucu doğrulama (authentication) yapmak isterse bu parametreyi kullanır. İstemci credentials bilgilerini Authorization parametresi ile gönderir.

Örnek
Sunucu tarayıcıya Basic authentication başlatmak için şöyle yapar. Tarayıcı popup gösterir.
WWW-Authenticate: Basic realm="myRealm"
Örnek
Sunucu tarayıcıya Digest authentication başlatmak için şöyle yapar. Tarayıcı popup gösterir.
WWW-Authenticate: Digest realm="...", qop="...", nonce="...", opaque="..."\r\n
Örnek
İstemci isteğinde token göndermezse, Sunucu 401 ve Bearer authentication hatası göndermek için şöyle yapar
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example"
Eğer token'da hata varsa sunucu şöyle yapar.
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
                         error="invalid_token",
                         error_description="The access token expired"
Bazen sunucu realm göndermez. O zaman şöyle yapar
HTTP/1.1 401
Set-Cookie: JSESSIONID=316DCFD55C302A8D69EFD865411DFA77; Path=/; HttpOnly
WWW-Authenticate: Bearer
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 0
Date: Thu, 09 Jan 2020 15:46:34 GMT
X İle Başlayan Parametreler
Açıklaması şöyle
There are also many custom headers that you will see frequently in your life as a developer. Here is a list of some that I’ve seen frequently:

1. X-Total-Count: This is a server-side header for pagination, and it gives you the total number of resources returned by your query. This way you can reflect how many pages of results remain for the user to browse.
2. X-Server: This is a server-side header to tell teh client which server is responding to the request, generally in the situation where load-balancing is occurring so the request could be from one of many servers.

3. X-Powered-By: This server side header communicated the technology of the server. Generally not recommended if security is a primary concern, but nevertheless commonly used.
X-Auth-Token Parametresi
"Token based authentication" için kullanılır. Authentication sonucu olumlu ise gönderilir. Standart bir header değildir. Açıklaması şöyle.
Please note that with X-Auth-Token being an unregistered header, it is subject to no formal specification and its presence and content is always tied to a respective application. No general assumptions can be made on it.
Şöyledir. Bu key/value değerleri daha sonra Http isteklerinde aynen kullanılır.
x-auth-token: 00661f53-8453-4daf-89f1-e748a3326040
XSRF-TOKEN Parametresi
Angular tarafından kullanılır. Sunucu ve istemci token'ı bu alan ile gönderir.

11 Haziran 2018 Pazartesi

HLA RTIambassador Arayüzü - Data Distribution Management

Giriş
Region'lar tanımlayarak verinin abone olan herkese gitmesi yerine, belli filtrelerden geçerse abonelere dağıtılmasını amaçlar. Böylece veri dağıtımı daha verilmi olabilir.

createRegion metodu
Örnek ver

deleteRegion metodu
Örnek ver

HLA RTIambassador Arayüzü - Declaration Management

Giriş
Açıklaması şöyle.
Publish and subscribe of object and interaction classes 

Interaction İçin
Metodlar şöyle
1 .getInteractionClassHandle
2 .getParameterHandle
3. subscribeInteractionClass
4. publishInteractionClass

getInteractionClassHandle metodu
Örnek ver

getParameterHandle metodu
Örnek ver

subscribeInteractionClass metodu
Alınması istenen interaction tipi belirtilir. Interaction gelince FederateAmbassador.receiveInteraction() metodu tetiklenir.

publishInteractionClass metodu
RTI'ye yaratacağımız interaction tipi bildirilir. Aynı tip interaction'ı almak için subscribeInteractionClass() çağrısı yapılır.

Object İçin
Metodlar şöyle
1. getObjectClassHandle
2. getAttributeHandle
3. subscribeObjectClassAttributes
4. publishObjectClassAttributes

getObjectClassHandle metodu - string
Bu metod ile getInteractionClassHandle() benzer şeyleri yaparlar. hla.rti1516.ObjectClassHandle nesnesi döner. Çağrı sırası şöyle. Parametre olarak sınıf ismini alır.
getObjectClassHandle ()  -> RTI
getAttributeHandle () -> RTI
publishObjectClassAttributes ()  -> RTI
getAttributeHandle metodu - hla.rti1516.ObjectClassHandle + string
Publish edilecek sınıfın alanına ait hla.rti1516.AttributeHandle nesnesi döner.

subscribeObjectClassAttributes metodu
Alınması istenen object belirtilir. Object gelince FederateAmbassador arayüzünün reflectAttributeValues() metodu tetiklenir.

publishObjectClassAttributes metodu
RTI'ye yaratıp güncelleyeceğimiz object tipi ve attribute'ları bildirilir. Aynı tip object'i almak için subscribeObjectClassAttributes() çağrısı yapılır.

HLA LogicalTime Arayüzü

Giriş
Şu satırı dahil ederiz.
import hla.rti1516.LogicalTime;
add metodu
Örnek ver

subtract metodu
Örnek ver

HLA FederateAmbassador Arayüzü

Giriş
Şu satırı dahil ederiz.
import hla.rti1516.FederateAmbassador ;
discoverObjectInstance metodu
FederateAmbassador Arayüzü - Object Management yazısına taşıdım.

enableTimeConstrained metodu
İmzası şöyle
void enableTimeConstrained ();
İşlem bitince timeConstrainedEnabled metodu çağrılır.

enableTimeRegulation metodu
İmzası şöyle
void enableTimeRegulation (LogicalTimeInterval var);
İşlem bitince timeRegulationEnabled metodu çağrılır.

federationSynchronized metodu - string
Tüm federelerin ismi belirtilen noktaya vardığı belirtilir.

reflectAttributeValues metodu

İmzası şöyle. LogicalTime yazısına bakabilirsiniz.
void reflectAttributeValues(ObjectInstanceHandle theObject,
                               AttributeHandleValueMap theAttributes,
                               byte[] userSuppliedTag,
                               OrderType sentOrdering,
                               TransportationTypeHandle theTransport,
                               LogicalTime theTime,
                               OrderType receivedOrdering,
                               MessageRetractionHandle retractionHandle,
                               SupplementalReflectInfo reflectInfo)
timeAdvanceGrant metodu
İmzası şöyle
void timeAdvanceGrant (LogicalTime var);
RTI tarafından çağrılan callback metodudur. Parametre olarak LogicalTime nesnesi alır. LogicalTime arayüzünü gerçekleştiren LogicalTimeDouble ve LogicalTimeLong sınıfları vardır.

timeConstrainedEnabled metodu
İmzası şöyle
void timeConstrainedEnabled (LogicalTime var);
RTI tarafından çağrılan callback metodudur. Örnek ver

timeRegulationEnabled metodu
RTI tarafından çağrılan callback metodudur. Örnek ver